package config

import (
	"flag" // 用于解析命令行参数
	"sync" // 用于提供同步原语，如互斥锁
)

// ==================== 系统核心配置 ====================

// 系统运行状态变量
var (
	// ModelReady 表示模型是否准备就绪的状态标识，0 可表示未准备就绪。
	ModelReady = 0
	// MaxModelAmount 表示系统支持的最大模型数量，0 可作为初始未设置值。
	MaxModelAmount = 0
)

// 模型服务映射与锁
var (
	// ModelPortMap 保存模型名称到其运行端口的映射关系。
	ModelPortMap = make(map[string]int)
	// ModelMapMutex 保护对 ModelPortMap 的并发读写操作。
	ModelMapMutex = sync.RWMutex{}
)

// ==================== 命令行参数配置 ====================

// 系统运行参数
var (
	SystemUrlPort = flag.Int("system_url_port", 36789, "系统服务监听的本机网页访问端口 \n用户可通过 http://localhost:<端口> 访问客户端界面，修改该值可避免端口冲突")

	SystemDevMode = flag.Bool("system_dev_mode", false, "是否进入开发者模式 \n开启后将显示更详细的运行日志，且服务启动时不会自动打开web客户端，需手动访问指定端口")

	UseLocalNetwork = flag.Bool("use_local_network", false, "控制是否使用局域网IP打开web客户端 \n仅影响自动打开的网页链接的IP类型，不影响服务本身绑定与功能")

	PortRelease = flag.Bool("port_release", false, "是否在启动时释放占用端口 \n开启后将自动终止占用指定端口的进程，避免端口冲突")
)

// 模型服务参数
var (
	ModelSystemPort = flag.Int("model_system_port", 0, "指定GGUF模型服务端口，0 表示使用内置服务 \n非零值时将连接该端口的外部服务，适用于分布式部署")

	ModelUrlPort = flag.Int("model_url_port", 40318, "GGUF模型服务监听的端口 \n用于提供服务接口，可修改以避免端口冲突")

	ModelFilePath = flag.String("model_file_path", LocalDir+"/models", "GGUF模型文件的存储目录 \n系统将在此目录下查找和加载模型文件")

	ModelServerSource = flag.String("model_server_source", LocalDir+"/extension/llama/llama-server.exe", "指定 llama-server.exe 程序的相对路径 \n该程序用于启动和管理GGUF模型服务")
)

// 模型文件路径参数
var (
	ModelEmbeddingIndex = flag.String("model_embedding_index", "void", "指定嵌入模型的文件路径 \n非 'void' 时直接加载该模型，否则使用默认目录中的第一个模型")

	ModelReasoningIndex = flag.String("model_reasoning_index", "void", "指定推理模型的文件路径 \n非 'void' 时直接加载该模型，否则使用默认目录中的第一个模型")

	ModelVisualingIndex = flag.String("model_visualing_index", "void", "指定视觉模型的文件路径 \n非 'void' 时直接加载该模型，否则使用默认目录中的第一个模型")
)

// 打包功能参数
var (
	OutBase = flag.String("out", "", "输出文件的基础名称（如需开启打包功能，需指定该参数）")

	PartSizeMB = flag.Int("size", 2048, "分卷大小(MB)")

	CompressionLevel = flag.Int("compression", 5, "压缩级别 (0-9) \n0表示不压缩，9表示固实压缩")

	PackageLevel = flag.Int("level", 3, "打包级别 (1-3)\n"+
		"  1: 核心文件 (可执行文件、网页、配置文件)\n"+
		"  2: 级别1 + 扩展程序\n"+
		"  3: 级别2 + 服务器文件 (所有文件)")
)

// 控制面板参数
var (
	ControlPanelMode = flag.Bool("control_panel", false, "启用控制面板模式 \n在此模式下只启动控制面板服务，不加载其他功能")

	ControlPanelPort = flag.Int("control_panel_port", *SystemUrlPort+15, "控制面板服务端口 \n用户可通过 http://localhost:<端口> 访问控制面板界面")
)
